package com.bdqn.logger;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * ServiceLogger
 *
 * @author LILIBO
 * @since 2021-10-19
 */
@Aspect
@Component
public class ServiceLogger {

    private Logger logger = Logger.getLogger(ServiceLogger.class);

    @Pointcut("execution(* com.bdqn.service..*.*(..))")
    public void pointcut() {}

    /**
     * 前置增强方法，此方法在执行被代理方法之前执行
     *
     * @param jp
     */
    @Before("pointcut()")
    public void before(JoinPoint jp) { // 连接点 JoinPoint 表示被连接的方法代码
        // JoinPoint对象中包含被代理对象的信息：jp.getTarget() 表示调用的对象； jp.getSignature() 表示连接的方法； jp.getArgs() 表示连接方法的参数列表
        logger.debug("============== 进入了 " + jp.getSignature().getName() + " 方法 ==============");
        logger.debug("参数是：" + Arrays.toString(jp.getArgs()));
    }

    /**
     * 后置增强方法，此方法在执行被代理方法之后（跳出方法）执行
     *
     * @param jp
     * @param result
     */
    @AfterReturning(pointcut = "pointcut()", returning = "result")
    public void afterReturning(JoinPoint jp, Object result) {
        logger.debug("============== 调用 " + jp.getSignature().getName() + " 方法完毕 ==============");
        logger.debug("返回值是：" + result);
    }


    /**
     * 最终增强方法，此方法在执行被代理方法之后（无论如何：finally）执行
     *
     * @param jp
     */
    @After("pointcut()")
    public void after(JoinPoint jp) {
        logger.debug("============== 调用 " + jp.getSignature().getName() + " 方法之后（无论如何）都会执行 ==============");
        logger.debug("这里的代码一定会执行，清理资源中。。。");
    }

}
